package com.example.p250201.common;

import com.alibaba.fastjson.JSON;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 通用的结果返回类
 * @param <T>
 */
public class ResponseResult<T> implements Serializable {

    private String host;

    private Integer code;

    private String message;

    private T data;

    // 属性封装，响应码
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    // 属性封装，报错信息
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    // 属性封装，数据体
    public T getData() {return data;}
    public void setData(T data) {
        this.data = data;
    }
    // 属性封装，服务器地址
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }

    // 全参构造器，响应码+消息+无数据，
    public ResponseResult(Integer code, String msg, T data) {
        this.code = code;
        this.message = msg;
        this.data = data;
    }
    // 有参构造器，响应码+数据，无消息，
    public ResponseResult(Integer code, T data) {
        this.code = code;
        this.data = data;
    }
    // 有参构造器，响应码+消息，无数据，
    public ResponseResult(Integer code, String msg) {
        this.code = code;
        this.message = msg;
    }
    // 默认无参构造器，设置默认响应码为200，
    public ResponseResult() {
        this.code = 200;
    }

    // ********
    public static ResponseResult response(AppHttpCodeEnum enums) {
        ResponseResult result = new ResponseResult(enums.getCode(), enums.getMessage());
        return result;
    }

    public static ResponseResult response(Integer code, String msg) {
        ResponseResult result = new ResponseResult(code,msg);
        return result;
    }


    // ************直接使用构造器
    // 请求成功，填充数据，
    // 对外接口，请求成功，统一响应，对外接口，静态方法，
    // 填充默认成功响应码+默认成功消息，
    public static ResponseResult success(Object data) {
        ResponseResult result = new ResponseResult(AppHttpCodeEnum.SUCCESS.getCode(), AppHttpCodeEnum.SUCCESS.getMessage());
        if(data!=null) {
            result.setData(data);
        }
        return result;
    }
    // ************直接使用构造器
    // 请求成功，无需数据，
    // 填充默认成功响应码+默认成功消息，
    public static ResponseResult success() {
        ResponseResult result = new ResponseResult(AppHttpCodeEnum.SUCCESS.getCode(), AppHttpCodeEnum.SUCCESS.getMessage());
        return result;
    }

    // 请求失败，解析枚举
    // ************直接使用构造器
    // 填充数据，对外接口，请求成功，统一响应，对外接口，静态方法，
    // 填充默认成功响应码+默认成功消息，
    public static ResponseResult error(AppHttpCodeEnum error) {
        ResponseResult result = new ResponseResult(error.getCode(), error.getMessage());
        return result;
    }

    // *************直接使用构造器，
    // 请求失败，自定义错误码+错误信息
    // 请求失败，统一响应，对外接口，静态方法，
    public static ResponseResult defeat(Integer code, String msg) {
        ResponseResult result = new ResponseResult(code,msg);
        return result;
    }
    // *************直接使用set方法，
    // 请求失败，自定义错误码+错误信息
    // 请求失败，统一响应，对外接口，静态方法，
    public static ResponseResult fail(Integer code, String msg) {
        ResponseResult result = new ResponseResult();
        result.setCode(code);
        result.setMessage(msg);
        return result;
    }

//     *************
//    属性赋值，响应码+消息，无数据
    public ResponseResult<?> error(Integer code, String msg) {
        this.code = code;
        this.message = msg;
        return this;
    }

    // 请求失败，统一响应，对外接口，静态方法，
    // 为啥要调用方法弯弯绕？
    public static ResponseResult errorResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.error(code, msg);
    }


    // *************
    // 属性赋值，无需返回数据
    public ResponseResult<?> ok(Integer code, String msg) {
        this.code = code;
        this.message = msg;
        return this;
    }

    // 请求成功，无需返回数据，统一响应，对外接口，静态方法，
    public static ResponseResult okResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.ok(code, msg);
    }
    //———————————
    // 只填枚举，
    public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums){
        return okResult(enums.getCode(),enums.getMessage());
    }
    // 只填枚举，
    public static ResponseResult errorResult(AppHttpCodeEnum enums){
        return setAppHttpCodeEnum(enums,enums.getMessage());
    }

    // 枚举+自定义消息
    // 将后端枚举转译为响应码，响应给前端，
    private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String message){
        return okResult(enums.getCode(),message);
    }

    // 枚举+自定义消息
    public static ResponseResult errorResult(AppHttpCodeEnum enums, String message){
        return setAppHttpCodeEnum(enums,message);
    }

    // 只填数据
    // 填充数据，对外接口，请求成功，统一响应，对外接口，静态方法，
    // 填充默认成功响应码+默认成功消息，
    public static ResponseResult okResult(Object data) {
        ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMessage());
        if(data!=null) {
            result.setData(data);
        }
        return result;
    }


    // 属性赋值，为啥不用set，要return this？
    // 全属性赋值，响应码+数据+消息
    public ResponseResult<?> ok(Integer code, String msg, T data) {
        this.code = code;
        this.data = data;
        this.message = msg;
        return this;
    }

    // 属性赋值，响应码+数据，无消息
    public ResponseResult<?> ok(Integer code, T data) {
        this.code = code;
        this.data = data;
        return this;
    }

    // 属性赋值，数据，无响应码+消息
    public ResponseResult<?> ok(T data) {
        this.data = data;
        return this;
    }

    public static void main(String[] args) {
        //前置
        /*AppHttpCodeEnum success = AppHttpCodeEnum.SUCCESS;
        System.out.println(success.getCode());
        System.out.println(success.getMessage());*/

        //查询一个对象
        /*Map map = new HashMap();
        map.put("name","zhangsan");
        map.put("age",18);
        ResponseResult result = ResponseResult.okResult(map);
        System.out.println(JSON.toJSONString(result));*/


        //新增，修改，删除  在项目中统一返回成功即可
        /*ResponseResult result = ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
        System.out.println(JSON.toJSONString(result));*/


        //根据不用的业务返回不同的提示信息  比如：当前操作需要登录、参数错误
        /*ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN,"自定义提示信息");
        System.out.println(JSON.toJSONString(result));*/

        //查询分页信息
        PageResponseResult responseResult = new PageResponseResult(1,5,50);
        List list = new ArrayList();
        list.add("itcast");
        list.add("itheima");
        responseResult.setData(list);
        System.out.println(JSON.toJSONString(responseResult));

    }

}
